package ft.ess.impl;

import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import ft.ess.util.NetUtil;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;

public class EchoSocketServerController
{
	public Button btnStart;
	public Button btnStop;
	public TextField txtIP;
	public TextField txtPort;
	public TextArea txtMsg;
	public TextField txtFolder;
	public TextField txtBasePath;
	public Label lblStatus;
	public Label lblStatus2;
	public Label lblStatus3;
	public ProgressBar pg1;
	public ProgressBar pg2;
	
	public void initialize()
	{
		btnStart.setOnAction(new EventHandler<ActionEvent>(){
			
			public void handle(ActionEvent arg0)
			{
				// 启动新线程，开始监听
				startListening();
				
				// 禁用按钮
				toggleStatusStart();
			}
		});
		
		btnStop.setOnAction(new EventHandler<ActionEvent>() {
			
			public void handle(ActionEvent arg0) {
				//停止监听
				stopListening();
				
				//启用按钮
				toggleStatusStop();
			}
		});
		
//		//取本机IP地址
//		txtIP.setText("192.168.9.105");
		
		//设置默认端口号
		txtPort.setText("10001");
		
		//文件接收目录
//		txtFolder.setText("C:/TEMP/x/");
		txtFolder.setText("D:/TEMP/x/");
		
		//远程 basepath
		txtBasePath.setText("/download");
//		txtBasePath.setText("/Screenshots");
		
		//显示本机IP地址
		dispLocalHost();
		
		//设置本机IP地址
		initLocalHost();
		
		// 设置界面按钮
		toggleStatusStop();
	}
	
	/**
	 * 开始监听
	 */
	private void startListening()
	{
		if(_impl==null)
		{
			_impl = new EchoServerSocketImpl(
					this, getIP(), getPort(), getFolder());
			
			_impl.addBasePath(getBasePath());
			_impl.addBasePath("/download");
			
			if(_impl!=null)
			{
				_impl.setRunning(true);
				Thread t1 = new Thread(_impl);
				t1.start();
			}
		}
	}
	
	/**
	 * 停止监听线程
	 */
	public void stopListening()
	{
		try
		{
			if(_impl!=null)
			{
				_impl.setRunning(false);
				if(_server!=null && (!_server.isClosed()))
				{
					_server.close();
				}
			}
			
		}
		catch (IOException e) {
			//e.printStackTrace();
			putMsg("关闭时有错误发生：\n"+e.getMessage());
		}
		finally
		{
			_server = null;
			_impl = null;
		}
	}
	
	public void setServer(ServerSocket server)
	{
		if(server!=null)
		{
			_server = server;
		}
	}
	
	private ServerSocket _server = null;
	
	public String getIP()
	{
		return txtIP.getText();
	}
	
	public int getPort()
	{
		int port = -1;
		String strPort = txtPort.getText();
		
		if(strPort!=null && strPort.length()>0)
		{
			try
			{
				port = Integer.parseInt(strPort);
			}
			catch(Exception ex)
			{}
		}
		
		return port;
	}
	
	public String getFolder()
	{
		return txtFolder.getText();
	}
	
	public String getBasePath()
	{
		return txtBasePath.getText();
	}
	
	private StringBuffer _sb = new StringBuffer(4096);
//	private List<String> _ls = new ArrayList<String>();
	
	public void putMsg(String msg)
	{
		putMsgA(msg);
	}
	
	/**
	 * 在消息前面插入新消息
	 * @param msg
	 */
	public void putMsgB(String msg)
	{
		if(msg!=null && msg.length()>0)
		{
//			_ls.add(msg);
			
//			_sb.append(msg);
			if( msg.charAt(msg.length()-1) != '\n')
			{
				_sb.insert(0,'\n');
			}
			_sb.insert(0,msg);
			txtMsg.setText(_sb.toString());
		}
	}
	
	/**
	 * 输出消息文本
	 * @param msg
	 */
	public void putMsgA(String msg)
	{
		if(msg!=null && msg.length()>0)
		{
			setLblStatus3(msg);
		}
	}
	
//	/**
//	 * 在消息后面追加消息
//	 * @param msg
//	 */
//	public void putMsgA(String msg)
//	{
//		if(msg!=null && msg.length()>0)
//		{
//			// 时间戳
//			{
//				String strTs19 = getCurrTs19();
//				if(strTs19!=null && strTs19.length()>0)
//				{
//					_sb.append(strTs19);
//				}
//			}
//			
//			_sb.append(msg);
////			_sb.insert(0,msg);
//			
//			if( msg.charAt(msg.length()-1) != '\n')
//			{
//				_sb.append('\n');
////				_sb.insert(0,'\n');
//			}
//			txtMsg.setText(_sb.toString());
//			txtMsg.setScrollTop(Double.MAX_VALUE);
//		}
//	}
	
	private EchoServerSocketImpl _impl = null;
	
	/**
	 * 将本机 IP 地址设置到 txtIP 控件上<br />
	 * 若系统有多个IP地址，则只显示第一个
	 */
	private void initLocalHost()
	{
		List<Map<String,String>> al = NetUtil.getLocalHost();
		if(al!=null && al.size()>0)
		{
			Map<String,String> m = al.get(0);
			if(m!=null && m.size()>0)
			{
				String ip = "";
				for(Entry<String,String> e : m.entrySet())
				{
					ip = e.getValue();
					if(ip!=null && ip.length()>0)
					{
						txtIP.setText(ip);
						break;
					}
				}
			}
		}
	}
	
	/**
	 * 显示本机IP地址
	 */
	private void dispLocalHost()
	{
		StringBuffer sb = new StringBuffer(256);
		List<Map<String,String>> al = NetUtil.getLocalHost();
		if(al!=null && al.size()>0)
		{
			sb.append("本机 IP 地址: ");
			for(int i=0;i<al.size();i++)
			{
				Map<String,String> m = al.get(i);
				int j=0;
				for(Entry<String,String> e : m.entrySet())
				{
					if(j>0)
					{
						sb.append(",");
					}
					sb.append(e.getKey());
					sb.append(':');
					sb.append(e.getValue());
					j++;
				}
				
			}
			sb.append('\n');
		}
		else
		{
			sb.append("取本机 IP 地址失败！");
		}
		putMsg(sb.toString());
	}
	
	/**
	 * 设置进度条：在 [0, 1] 之间。
	 * @param v1
	 */
	public void setPg1Val(double v1)
	{
		if(pg1!=null && v1>=0.0D && v1<=1.0D)
		{
			pg1.setProgress(v1);
		}
	}
	
	/**
	 * 设置进度条：在 [0, 1] 之间。
	 * @param v1
	 */
	public void setPg2Val(double v1)
	{
		if(pg2!=null && v1>=0.0D && v1<=1.0D)
		{
			pg2.setProgress(v1);
		}
	}
	
	/**
	 * 设置 lblStatus 状态文字
	 * @param msg
	 */
	public void setLblStatus(String msg)
	{
		if(lblStatus!=null && msg!=null && msg.length()>0)
		{
			lblStatus.setText(msg);
		}
	}
	
	/**
	 * 设置 lblStatus2 状态文字
	 * @param msg
	 */
	public void setLblStatus2(String msg)
	{
		if(lblStatus2!=null && msg!=null && msg.length()>0)
		{
			lblStatus2.setText(msg);
		}
	}
	
	/**
	 * 设置 lblStatus3 状态文字
	 * @param msg
	 */
	public void setLblStatus3(String msg)
	{
		if(lblStatus3!=null && msg!=null && msg.length()>0)
		{
			lblStatus3.setText(msg);
		}
	}
	
	/**
	 * 点击停止后，启用界面上的控件<br />
	 */
	private void toggleStatusStop()
	{
		if(btnStart!=null)
		{
			btnStart.setDisable(false);
		}
		
		// 除了停止按钮可用，其他按钮都不可用
		if(btnStop!=null)
		{
			btnStop.setDisable(true);
		}
		
		if(txtIP!=null)
		{
			txtIP.setDisable(false);
		}
		
		if(txtPort!=null)
		{
			txtPort.setDisable(false);
		}
		
		if(txtFolder!=null)
		{
			txtFolder.setDisable(false);
		}
		
		if(txtBasePath!=null)
		{
			txtBasePath.setDisable(false);
		}
	}
	
	/**
	 * 点击开始后，禁用界面上的控件<br />
	 */
	private void toggleStatusStart()
	{
		if(btnStart!=null)
		{
			btnStart.setDisable(true);
		}
		
		// 除了停止按钮可用，其他按钮都不可用
		if(btnStop!=null)
		{
			btnStop.setDisable(false);
		}
		
		if(txtIP!=null)
		{
			txtIP.setDisable(true);
		}
		
		if(txtPort!=null)
		{
			txtPort.setDisable(true);
		}
		
		if(txtFolder!=null)
		{
			txtFolder.setDisable(true);
		}
		
		if(txtBasePath!=null)
		{
			txtBasePath.setDisable(true);
		}
	}
	
	/**
	 * 返回当前日期时间
	 * @return
	 */
	private String getCurrTs19()
	{
		return ft.ess.util.UDate.getCurrTs19();
	}
}
